AWS ClientVPN에 대하여 알아보자
안녕하세요 클래스메소드의 수재입니다.
이번에 Site to Site VPN 대신 ClientVPN을 통한 접속이 필요한 환경 구축이 필요하였습니다.
복습도 겸해서 AWS ClientVPN이 어떤 서비스인지 알아보고자 합니다.
AWS VPN 서비스
AWS에서 제공하고 있는 VPN 서비스에는 Site to Site VPN(이하 S2S VPN)과 ClientVPN 이 있습니다.
이름 그대로 S2S VPN은 이름 그대로 거점과 거점을 이어주는 서비스이며 ClientVPN은 Client(유저)가 AWS 상의 네트워크에 직접 접속하는 VPN 서비스입니다.
S2S vpn의 경우 유저가 AWS 환경에 접속하기 위해서는 VPN으로 연결된 거점의 네트워크를 거쳐야만 통신이 가능합니다.
Client VPN은 AWS 환경의 Client VPN Endpoint에 연결할 수 있는 인증서만 가지고 있다면 상호 인증을 통하여 어디서든 연결이 가능합니다.
따라서 연결을 허용할 대상에 따라서 알맞은 VPN 서비스를 이용하는 것이 좋습니다.
AWS Client VPN
AWS Client VPN은 AWS 리소스 및 온프레미스 네트워크의 리소스에 안전하게 액세스할 수 있도록 하는 관리형 클라이언트 기반 VPN 서비스입니다. Client VPN에서는 OpenVPN 기반 VPN 클라이언트를 사용하여 어떤 위치에서든 리소스에 액세스할 수 있습니다. - 공식 문서
위에 설명했듯이 VPN 연결을 위한 거점을 대상으로 하는 것이 아닌 VPC에 연결된 엔드포인트를 통과할 유저를 대상으로 VPN 연결을 허용합니다.
Client VPN에서는 다음과 같은 유형의 클라이언트 인증을 제공하며 하나의 방법만 사용하거나 상호 인증과 나머지 다른 방법 중 하나를 조합해서 사용할 수 있습니다.
- Active Directory 인증(사용자 기반)
- 상호 인증(인증서 기반)
- Single sign-on(SAML 기반 연동 인증)(사용자 기반)
접근 제한
유저가 접근할 수 있는 IP 대역의 제한은 보안 그룹 및 네트워크 기반 권한 부여(권한 부여 규칙 사용)으로 가능합니다.
보안 그룹
ClientVPN 엔드포인트와 연결된 서브넷에는 네트워크 인터페이스가 생성됩니다.
이 인터페이스에 보안 그룹을 연결하면 인스턴스 혹은 서비스에 연결된 보안 그룹에 인터페이스의 보안 그룹을 통과하는 트래픽을 허용 혹은 거부 할지 설정하는 것으로 접근을 제한할 수 있습니다.
출처 : 공식 문서
ClientVPN용 인터페이스에 연결된 보안 그룹의 인바운드를 설정한다고 하더라도 엔드포인트를 통과하는 트래픽은 막을 수 없습니다.
예로 들자면 인터페이스에 연결된 보안 그룹에 특정 IP의 22번 포트만을 허용하는 인바운드 설정을 추가하더라도 설정한 IP 이외의 IP도 엔드포인트를 통과할 수 있습니다.
권한 부여
Active Directory 인증 또는 SAML 기반 연동 인증을 사용한다면 네트워크 그룹마다 권한을 부여할 수 있습니다.
인증서를 통한 상호 인증의 경우에는 모두 허용만 설정할 수 있습니다.
경로 우선 순위로 권한 부여 규칙을 평가할 때 가장 긴 접두사 일치를 사용합니다.
자세한 내용은 공식 문서를 참고해주세요.
로깅
CloudWatch를 통한 매트릭 감시는 물론 연결 로깅을 설정하여 로그를 수집할 수 있습니다. 수집한 로그는 CloudWatch의 로그 그룹에 저장됩니다.
기록되는 로그에는 연결의 성공 여부나 접속한 IP, 프로토콜, 인증서 기반의 연결의 경우 인증서 이름 등의 내용이 기록됩니다.
로그 목록은 공식 문서를 참고해주세요.
설정해보기
간단히 인증서를 통한 상호 인증 방법으로 ClientVPN을 생성하고 연결하는 작업을 해보겠습니다.
참고 : 공식 문서
작업 순서는 다음과 같습니다.
- 서버와 클라이언트 인증서 및 키 생성
- 클라이언트 VPN 엔드포인트 생성
- 대상 네트워크 연결
- VPC에 대한 권한 부여 규칙 추가
- 인터넷 액세스 제공(옵션)
- 보안 그룹 요구 사항 확인
- Client VPN 엔드포인트 구성 파일 다운로드
- Client VPN 엔드포인트에 연결
서버와 클라이언트 인증서 및 키 생성
상호 인증을 위한 서버 인증서와 클라이언트 인증서가 없다면 생성합니다.
공식 문서에서는 OpenVPN easy-rsa를 사용하는 방법을 예시로 들고 있습니다.
해당 리포지토리를 클론한 뒤 easyrsa3
라는 디렉터리로 이동한 후 작업합니다.
# 새 PKI 환경 시작 ./easyrsa init-pki # 인증 기관(발급 기관) 체인 작성 ./easyrsa build-ca nopass # 서버 인증서 및 키 생성 # build-server-full {원하는 서버 도메인} nopass ./easyrsa build-server-full server nopass # 클라이언트 인증서 및 키 생성 # build-client-full {클라이언트 이름}.{원하는 도메인} nopass ./easyrsa build-client-full sujae1.test.com nopass # 이후 pki/issued 및 pki/private 아래에 있는 작성한 서버 및 클라이언트 인증서, 키 이동
그리고 작성한 인증서 및 키를 ACM에 등록합니다.
CLI나 콘솔에서 등록할 수 있습니다.
콘솔에서는 ACM에 접속한 후 [가져오기]를 클릭합니다. 그리고 [본문]에는 서버 인증서(.crt), [키]에는 서버 키(.key), [인증서 체인]에는 발급 기관 인증서(ca.crt)의 값을 붙여넣습니다.
-----BEGIN ~~~~~-----
부터 -----END ~~~~-----
까지 모두 붙여넣습니다.
만약 서버 인증서와 클라이언트 인증서의 발급 기관이 다르다면 클라이언트 인증서도 ACM에 등록합니다.
클라이언트 VPN 엔드포인트 생성
VPC의 ClientVPN서비스에 접속해서 엔드포인트를 생성합니다.
클라이언트 IPv4 CIDR는 클라이언트가 접속했을 때 부여 받을 IP의 CIDR 범위입니다.
인증 정보에서는 위에서 설명했듯이 서버 인증서와 클라이언트 인증서의 발급 기관이 같다면 둘 다 서버 인증서의 ARN을 지정하면 되지만 다르다면 클라이언트 인증서 ARN을 등록합니다.
분할 터널 옵션을 활성화 하면 ClientVPN의 라우팅 테이블에 AWS 네트워크의 연결 대상이 되는 루트가 연결이 필요한 트래픽만 AWS로 향하게 설정할 수 있습니다.
그리고 VPC와 아무런 설정이 되어 있지 않은 보안 그룹을 지정해줍니다.
상호 인증의 경우 셀프 서비스 포털 서비스는 이용할 수 없습니다. 옵션의 활성화는 되지만 접속은 되지 않습니다.
옵션에 문제가 없다면 생성합니다.
대상 네트워크 연결 및 권한 부여
엔드포인트가 생성하면 [대상 네트워크 연결]이라는 탭을 확인할 수 있습니다.
여기서 [대상 네트워크 연결]을 클릭하여 엔드포인트의 인터페이스를 생성할 서브넷을 지정해줍니다.
퍼블릭이든 프라이빗이든 상관없습니다.
서브넷을 연결하였다면 [권한 부여 규칙] 탭에서 [권한 부여 규칙 추가] 버튼을 클릭하여 규칙을 추가합니다.
[액세스를 활성화할 대상 네트워크]에는 VPC의 CIDR를 기입해주고 상호 인증이기 때문에 전부 허가를 체크한 후 생성합니다.
이렇게 설정하면 상호 인증을 통과한 유저는 클라이언트 VPN을 통하여 VPC의 모든 서브넷에 접근이 가능합니다.
인터넷 액세스 제공(옵션)
ClientVPN을 통과하는 트래픽이 AWS 네트워크에서 다시 인터넷으로 향해야하는 경우에 설정합니다.
설정 방법은 생성한 엔드포인트의 [라우팅 테이블] 탭에서 [경로 생성]을 클릭합니다.
경로는 0.0.0.0/0 을 지정하고 인터넷 게이트웨이가 연결된 서브넷을 대상으로 지정합니다.
마지막으로 권한 설정에서 0.0.0.0/0에 대한 권한을 모두 허용하도록 설정합니다.
보안 그룹 요구 사항 확인
유저가 대상으로 하는 인스턴스나 서비스에 접근할 수 있도록 ClientVPN 엔드포인트에 연결된 보안 그룹으로 부터의 트래픽을 허용하는 인바운드 규칙을 접속하고자 하는 인스턴스 및 서비스의 보안 그룹에 추가합니다.
ClientVPN 구성 파일 다운로드 및 연결 확인
유저는 구성 파일(.ovpn)을 가지고 OpenVPN에 연결하여 상호 인증을 수행할 수 있습니다.
엔드포인트 목록에서 대상으로하는 엔드포인트를 선택한 후 [클라이언트 구성 다운로드]를 클릭합니다.
파일 내용을 보면 로 시작하는 블럭이 추가되어 있는 것을 확인할 수 있습니다.
그 아래에
블럭과 블럭도 추가하여
에는 클라이언트 인증서의 내용을 적고 ``에는 클라이언트 비밀키의 내용을 적습니다.
<ca> -----BEGIN CERTIFICATE----- MI... -----END CERTIFICATE----- </ca> <cert> -----BEGIN CERTIFICATE----- MII... -----END CERTIFICATE----- </cert> <key> -----BEGIN PRIVATE KEY----- MII...Yg= -----END PRIVATE KEY----- </key> reneg-sec 0
이 후 AWS VPN Client나 OpenVPN 등 본인이 원하는 VPN 서비스로 ovpn 파일을 읽은 후 연결하면 엔드포인트를 생성할 때 설정했던 포트 및 프로토콜로 접속이 시도됩니다.
끝으로
기존 S2S VPN을 사용할 때와는 다르게 유저쪽에서 무언가를 설정해야하는 번거로움이 있었지만 그래도 유용하게 쓸 수 있을거라는 생각이 들었습니다.
연결하는 대상에 따라 알맞은 VPN을 사용하도록 합시다.
긴 글 읽어주셔서 감사합니다.
오탈자 및 내용 피드백은 언제나 환영합니다. must01940 지메일로 연락 주시면 감사합니다!
본 블로그 게시글을 보시고 문의 사항이 있으신 분들은
클래스메소드코리아 (info@classmethod.kr)로 연락 주시면 빠른 시일 내 담당자가 회신 드릴 수 있도록 하겠습니다 !